Estimation of Ideal Points using Cast Vote Records

Quant III and Bayesian Measurement

Mason Reece

November 29, 2023

Introduction

How representative is a government of its people?

  • One approach (of many) compares the “ideological” positions of legislators and voters

Cast Vote Records

  • Anonymous records of what candidate each voter picked in each race on the ballot

  • Modelling challenges

    • Categorical outcome with different options for each race

    • People vote in different races

  • 1.3B “bubbles” and 50m voters in 2020 election

Distribution of Cast Vote Records

Methodology

Continuous, latent outcome with categorical indicators –> IRT model

\[ \pi_{j,k(c)} = logit^{-1} (\gamma_{k(c)} (\alpha_j - \beta_{k(c)})) \]

where \(j\) indexes individuals and \(k(c)\) indexes a specific candidate \(c\) in a race \(k\).

  • \(\gamma\) is the “discrimination” parameter

    • \(=1\) in the “Rasch” model, implies all races inform \(\alpha\) equally
  • \(\alpha\) is the latent trait

  • \(\beta\) is the “difficulty” parameter

  • \(\kappa = \frac{\alpha}{\beta}\) is the cutpoint between each choice

Identification and Priors

  • The scale and location of \(\alpha\) are unidentified (can add or multiply a constant with no change in likelihood)

    • Set prior to \(\mathcal{N}(0, 1)\)
  • \(\gamma\)’s sign can also flip around with relation to the sign of \(\alpha\).

    • Constrain \(\gamma > 0\)
  • Priors

    • Uninformative, standard priors for other parameters

    • Future work: Informative priors using party or NOMINATE/DIME scores to help with identification and speed convergence

Stan Code

// Priors
mu_beta ~ cauchy(0, 5);
alpha ~ std_normal();

for (k in 1:K){
  beta_raw[k,] ~ normal(0, sigma_beta);
  gamma_raw[k,] ~ lognormal(0, sigma_gamma);
}

sigma_beta ~ cauchy(0, 5);
sigma_gamma ~ cauchy(0, 5);

// Likelihood
for (j in 1:J) {
  matrix[K, C] logits = rep_matrix(-1e8, K, C);
  for (k in 1:K) {
    if (eligibility[j, k] == 1) {
      for (c in 1:C) {
        if (candidates[k, c] == 1) {
          logits[k, c] = gamma[k, c] * alpha[j] - (beta[k, c] + mu_beta);
        }
      }
      target += categorical_logit_lpmf(votes[j, k] | logits[k]');
    }
  }
}

Convergence

\(\pi_{i, j(c)}\) as a Binary Variable – Rasch

Binary Results - \(\alpha\)

Binary Results - \(\beta\) and \(\gamma\)

\(\pi_{i, j(c)}\) as a Categorical Variable – Rasch

Categorical Rasch Results

Categorical 2PL Results

Application to Representation

Work with the binary 2PL results, since they are easiest to interpret

References